#pragma once
#include <cstdio>
#include <cstdlib>
#include <cstdint>
#include <cstdbool>
#include <cassert>
#include <cstring>
#include <iostream>
#include <iomanip>

#include "verilated_vcd_c.h"
#include "verilated_fst_c.h"

#define RESET "\033[0m"
#define BLACK "\033[30m"              /* Black */
#define RED "\033[31m"                /* Red */
#define GREEN "\033[32m"              /* Green */
#define YELLOW "\033[33m"             /* Yellow */
#define BLUE "\033[34m"               /* Blue */
#define MAGENTA "\033[35m"            /* Magenta */
#define CYAN "\033[36m"               /* Cyan */
#define WHITE "\033[37m"              /* White */
#define BOLDBLACK "\033[1m\033[30m"   /* Bold Black */
#define BOLDRED "\033[1m\033[31m"     /* Bold Red */
#define BOLDGREEN "\033[1m\033[32m"   /* Bold Green */
#define BOLDYELLOW "\033[1m\033[33m"  /* Bold Yellow */
#define BOLDBLUE "\033[1m\033[34m"    /* Bold Blue */
#define BOLDMAGENTA "\033[1m\033[35m" /* Bold Magenta */
#define BOLDCYAN "\033[1m\033[36m"    /* Bold Cyan */
#define BOLDWHITE "\033[1m\033[37m"   /* Bold White */

#define COLOR(fmt, color) color fmt RESET

#define LOG(fmt, ...) printf(fmt "\n", ##__VA_ARGS__)

#define Assert(cond, fmt, ...)                                                           \
    do                                                                                   \
    {                                                                                    \
        if (!(cond))                                                                     \
        {                                                                                \
            LOG(COLOR("Error : " fmt " at %lu", RED), ##__VA_ARGS__, Verilated::time()); \
            Verilated::gotFinish(true);                                                  \
            Verilated::gotError(true);                                                   \
        }                                                                                \
    } while (0);

typedef uint64_t word_t;
typedef uint32_t pc_t;
